package com.itheima.pinda.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.pinda.DTO.base.GoodsTypeDto;
import com.itheima.pinda.common.CustomIdGenerator;
import com.itheima.pinda.common.utils.Constant;
import com.itheima.pinda.entity.PdGoodsType;
import com.itheima.pinda.entity.PdTruckTypeGoodsType;
import com.itheima.pinda.mapper.PdGoodsTypeMapper;
import com.itheima.pinda.mapper.PdTruckTypeGoodsTypeMapper;
import com.itheima.pinda.service.PdGoodsTypeService;
import com.itheima.pinda.service.PdTruckTypeGoodsTypeService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;


import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class PdGoodsTypeServiceImpl extends ServiceImpl<PdGoodsTypeMapper,PdGoodsType> implements PdGoodsTypeService {

    @Autowired
    private PdTruckTypeGoodsTypeService pdTruckTypeGoodsTypeService;
    @Autowired
    private CustomIdGenerator idGenerator;
    @Autowired
    private PdGoodsTypeMapper pdGoodsTypeMapper;
    @Autowired
    private PdTruckTypeGoodsTypeMapper pdTruckTypeGoodsTypeMapper;

    @Override
    @Transactional
    public GoodsTypeDto goodsTypeAddOrUpdate(GoodsTypeDto goodsTypeDto) {
        // 保存货物类型
        PdGoodsType pdGoodsType = new PdGoodsType();
        BeanUtils.copyProperties(goodsTypeDto,pdGoodsType);

        if (StringUtils.isEmpty(pdGoodsType.getId())) {
            // 新增
            pdGoodsType.setId(idGenerator.nextId(pdGoodsType) + "");
            int insert = pdGoodsTypeMapper.insert(pdGoodsType);

            if (insert < 1) {
                throw new RuntimeException("新增货物类型失败！");
            }
        }else {
            // 更新
            pdGoodsTypeMapper.update(pdGoodsType,null);
            // 删除货物车辆关联关系数据
            pdTruckTypeGoodsTypeMapper.delete(
                    new LambdaQueryWrapper<PdTruckTypeGoodsType>()
                            .eq(PdTruckTypeGoodsType :: getGoodsTypeId,pdGoodsType.getId()));

        }

        // 保存货物车辆关联关系
        List<String> truckTypeIds = goodsTypeDto.getTruckTypeIds();
        List<PdTruckTypeGoodsType> list = truckTypeIds.stream().map(truckTypeId -> {

            PdTruckTypeGoodsType TruckTypeGoodsType = new PdTruckTypeGoodsType();
            TruckTypeGoodsType.setGoodsTypeId(pdGoodsType.getId());
            TruckTypeGoodsType.setTruckTypeId(truckTypeId);
            TruckTypeGoodsType.setId(idGenerator.nextId(TruckTypeGoodsType) + "");
            return TruckTypeGoodsType;
        }).collect(Collectors.toList());

        pdTruckTypeGoodsTypeService.AddList(list);

        goodsTypeDto.setId(pdGoodsType.getId());

        return goodsTypeDto;
    }

    @Override
    public GoodsTypeDto selectById(String id) {

        // 查询货物类型
        PdGoodsType pdGoodsType = pdGoodsTypeMapper.selectOne(new LambdaQueryWrapper<PdGoodsType>().eq(PdGoodsType::getId, id));

        if (ObjectUtils.isEmpty(pdGoodsType)) {
            return null;
        }
        // 查询关联关系表
        List<PdTruckTypeGoodsType> pdTruckTypeGoodsTypes =
                pdTruckTypeGoodsTypeMapper.selectList(
                        new LambdaQueryWrapper<PdTruckTypeGoodsType>()
                                .eq(PdTruckTypeGoodsType::getGoodsTypeId, pdGoodsType.getId()));
        List<String> truckTypeIds = pdTruckTypeGoodsTypes.stream().map(PdTruckTypeGoodsType::getTruckTypeId).collect(Collectors.toList());

        GoodsTypeDto goodsTypeDto = new GoodsTypeDto();
        goodsTypeDto.setTruckTypeIds(truckTypeIds);
        return goodsTypeDto;
    }

    @Override
    public List<GoodsTypeDto> selectList() {

        ArrayList<GoodsTypeDto> goodsTypeDtos = new ArrayList<>();

        List<PdGoodsType> pdGoodsTypes = pdGoodsTypeMapper.selectList(null);

        if (null != pdGoodsTypes || pdGoodsTypes.size() > 0) {

            for (PdGoodsType pdGoodsType : pdGoodsTypes) {
                GoodsTypeDto goodsTypeDto = new GoodsTypeDto();
                BeanUtils.copyProperties(pdGoodsType,goodsTypeDto);

                // 查询关联关系表
                List<PdTruckTypeGoodsType> pdTruckTypeGoodsTypes =
                        pdTruckTypeGoodsTypeMapper.selectList(
                                new LambdaQueryWrapper<PdTruckTypeGoodsType>()
                                        .eq(PdTruckTypeGoodsType::getGoodsTypeId, pdGoodsType.getId()));
                List<String> truckTypeIds = pdTruckTypeGoodsTypes.stream().map(PdTruckTypeGoodsType::getTruckTypeId).collect(Collectors.toList());

                goodsTypeDto.setTruckTypeIds(truckTypeIds);
                goodsTypeDtos.add(goodsTypeDto);
            }
            return goodsTypeDtos;
        }
        return null;
    }

    @Override
    public IPage<GoodsTypeDto> selectByPage(Integer pageNum, Integer pageSize, String name, String truckTypeId, String truckTypeName) {
        Page<PdGoodsType> page = new Page<PdGoodsType>(pageNum, pageSize);
        List<PdGoodsType> pdGoodsTypes = pdGoodsTypeMapper.selectByPage(page, name, truckTypeId, truckTypeName);

        ArrayList<GoodsTypeDto> goodsTypeDtos = new ArrayList<>();

        if (null != pdGoodsTypes || pdGoodsTypes.size() > 0) {

            for (PdGoodsType pdGoodsType : pdGoodsTypes) {
                GoodsTypeDto goodsTypeDto = new GoodsTypeDto();
                BeanUtils.copyProperties(pdGoodsType,goodsTypeDto);

                // 查询关联关系表
                List<PdTruckTypeGoodsType> pdTruckTypeGoodsTypes =
                        pdTruckTypeGoodsTypeMapper.selectList(
                                new LambdaQueryWrapper<PdTruckTypeGoodsType>()
                                        .eq(PdTruckTypeGoodsType::getGoodsTypeId, pdGoodsType.getId()));
                List<String> truckTypeIds = pdTruckTypeGoodsTypes.stream().map(PdTruckTypeGoodsType::getTruckTypeId).collect(Collectors.toList());

                goodsTypeDto.setTruckTypeIds(truckTypeIds);
                goodsTypeDtos.add(goodsTypeDto);
            }
        }

        return new Page<GoodsTypeDto>().setRecords(goodsTypeDtos);
    }

    @Override
    public void goodsTypeDelete(List<String> ids) {
        // 删除货物类型
        pdGoodsTypeMapper.update(null,
                new LambdaUpdateWrapper<PdGoodsType>()
                        .set(PdGoodsType::getStatus, Constant.DATA_DISABLE_STATUS)
                        .in(PdGoodsType::getId,ids));

    }

}
